package com.learn.spring5;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.lang.reflect.InvocationHandler;

public class JDKProxy
{
	public static void main(String[] args)
	{

		// 创建接口实现类代理对象
		Class[] interfaces =
		{ UserDao.class };
		// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,
		// new InvocationHandler()
		// {
		//
		// @Override
		// public Object invoke(Object proxy, Method method, Object[] args)
		// throws Throwable
		// {
		// // TODO Auto-generated method stub
		// return null;
		// }
		// });
		UserDaoImpl userDao = new UserDaoImpl();
		UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
		int result = dao.add(1, 2);
		System.out.println("result:" + result);
	}
}

/**
 * 
* @ClassName: UserDaoProxy  
* @Description: 类实现接口  
* @author myande  
* @date 2021年6月16日  
*
 */
class UserDaoProxy implements InvocationHandler
{

	// 1. 把创建的是谁的代理对象，把谁传递过来
	// 有参数构造传递
	private Object obj;

	public UserDaoProxy(Object obj)
	{
		this.obj = obj;
	}

	// 增强的逻辑
	@Override
	public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable
	{
		// 方法之前
		System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(arg));

		// 被增强的方法执行
		Object res = method.invoke(obj, arg);

		// 方法之后
		System.out.println("方法之后执行..." + obj);

		return res;
	}

}